package com.thd.springboot.project.camundamanager.service;


import com.github.pagehelper.PageInfo;
import com.thd.springboot.project.camundamanager.constant.ProcConstant;
import com.thd.springboot.project.camundamanager.dto.CompleteTaskDto;
import com.thd.springboot.project.camundamanager.dto.StartProcessInstanceDto;
import com.thd.springboot.project.camundamanager.dto.UserOfTaskDto;
import com.thd.springboot.project.camundamanager.entity.*;
import io.swagger.annotations.ApiModel;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * com.thd.processmanagementserver.service.impl.ProcessService
 *
 * @author: wanglei62
 * @DATE: 2021/1/25 15:05
 **/

@ApiModel(value="流程引擎服务",description="流程引擎公共服务")

public interface ProcessService {

    // ==================== 部署相关 ========================

    /**
     * 部署流程定义
     * @param is bpmn的输入流
     * @param bpmnName 文件名
     * @return ProcDeployEntity
     */
    public ProcDeployEntity deployProcDef(InputStream is , String bpmnName);

    /**
     * 根据部署ID删除部署(级联删除，会同时删除该流程部署下的流程定义、流程实例)
     * @param deploymentId 部署ID
     * @return
     */
    public void deleteProcDefDeployById(String deploymentId);

    // ==================== 流程定义相关 ======================

    /**
     * 根据流程定义ID 查询流程定义
     * @param procDefId 流程定义ID
     * @return 流程定义实体
     */
    public ProcDefEntity queryProcDefById(String procDefId);

    /**
     * 流程定义列表分页查询
     * @param condition 查询条件
     * @return 流程定义列表
     */
    public PageInfo<ProcDefEntity> queryProcessDefPage(ProcDefEntity condition);

    /**
     * 流程定义列表查询
     * @param condition 查询条件
     * @return 流程定义列表
     */
    public List<ProcDefEntity> queryProcessDefList(ProcDefEntity condition);

    /**
     * 删除流程定义
     * @param processDefId
     */
    public void deleteProcessDefById(String processDefId);



    // ==================== 流程实例相关 ======================

    /**
     * 开启流程实例,启动流程(从开始节点启动)
     * @param startProcessInstanceDto 开启流程信息
     * @return
     */
    public ProcessInstanceEntity startProcess(StartProcessInstanceDto startProcessInstanceDto);




    /**
     * 根据流程实例ID查询流程实例
     * @param processInstanceId 流程实例ID
     * @return ProcessInstanceEntity
     */
    public ProcessInstanceEntity queryProcessInstanceByInstanceId(String processInstanceId);
    /**
     *
     * 根据流程实例ID查询流程实例详细信息-带有历史task列表和当前task列表
     * @param processInstanceId 流程实例ID
     * @return ProcessInstanceEntity
     */
    public ProcessInstanceEntity queryProcessInstanceDetailByInstanceId(String processInstanceId);


    /**
     * 挂起某个流程实例
     * @param processInstanceId 流程实例ID
     */
    public void suspendsProcessInstance(String processInstanceId);


    /**
     * 激活某个已挂起的流程实例
     * @param processInstanceId 流程实例ID
     */
    public void activateProcessInstance(String processInstanceId);

    /**
     * 删除某个流程实例
     * Method Description : 删除某个流程实例
     * @param processInstanceId 流程实例ID
     * @param deleteReason 取消原因
     */
    public void cancelProcessInstance(String processInstanceId,String deleteReason);

    /**
     * 根据流程实例查询当前executions
     * @param processInstanceId 流程实例ID
     * @return List<ProcessInstanceExecutionEntity>
     */
    public List<ProcessInstanceExecutionEntity> queryCurrentExecutes(String processInstanceId);
    // ==================== 任务相关 ======================


    /**
     * 查询任务 - 分页
     * @param condition 查询条件
     * @return PageInfo<ProcessInstanceTaskEntity>
     */
    public PageInfo<ProcessInstanceTaskEntity> queryTaskPage(ProcessInstanceTaskEntity condition);


    /**
     * 查询任务 - 不分页
     * @param condition 查询条件
     * @return List<ProcessInstanceTaskEntity>
     */
    public List<ProcessInstanceTaskEntity> queryTaskList(ProcessInstanceTaskEntity condition);
    /**
     * 根据流程实例ID查询任务历史列表
     * @param processInstanceId 流程实例ID
     * @return List<ProcessInstanceTaskEntity>
     */
    public List<ProcessInstanceTaskEntity> queryTaskList(String processInstanceId);
    /**
     * 根据taskId查询任务
     * @param taskId 任务ID
     * @return ProcessInstanceTaskEntity
     */
    public ProcessInstanceTaskEntity queryTaskByTaskId(String taskId);

    /**
     * 根据taskId查询历史任务
     * @param taskId 任务ID
     * @return
     */
    public ProcessInstanceTaskEntity queryTaskHisByTaskId(String taskId);
    /**
     * 查询某任务的待办人
     * @param taskId 任务ID
     * @return List<String>
     */
    public List<String> queryCandidateForTask(String taskId);

    /**
     * 查询某人个人任务
     * @param assignee 人员标识
     * @return
     */
    public List<ProcessInstanceTaskEntity> queryTaskForAssignee(String assignee);

    /**
     * 查询某人可以签收的任务(是assignee而不是candidate的不会查出来)
     * @param candidate 人员标识
     * @return
     */
    public List<ProcessInstanceTaskEntity> queryTaskForCandidate(String candidate);

    /**
     * 查询某人可以签收的任务和待办
     * @param assigneeOrcandidate 人员标识
     * @return
     */
    public List<ProcessInstanceTaskEntity> queryTaskForUser(String assigneeOrcandidate);


    /**
     * 根据流程实例查询当前task
     * @param processInstanceId 流程实例ID
     * @return List<ProcessInstanceTaskEntity>
     */
    public List<ProcessInstanceTaskEntity> queryCurrentTaskByProcessInstanceId(String processInstanceId);
    /**
     * 根据业务主键查询当前task
     * @param businessKey 业务主键
     * @return List<ProcessInstanceTaskEntity>
     */
    public List<ProcessInstanceTaskEntity> queryCurrentTaskByBusinessKey(String businessKey);
    /**
     * 完成某任务
     * @param completeTaskDto 完成任务的信息
     */
    public void completeTask(CompleteTaskDto completeTaskDto);




    /**
     * 签收某任务 taskId 任务ID
     * @param userId 人员ID
     */
    public void claimTask(String taskId, String userId);

    /**
     * 签收并完成某任务
     * @param taskId 任务ID
     * @param userId 人员ID
     * @param variableMap 流程变量
     */
    public void claimAndComplateTask(String taskId, String userId, Map<String, Object> variableMap);

    /**
     * 为某个Task删除加候选人
     * @param taskId 任务ID
     * @param userId 人员ID
     */
    public void deleteCandidateUserFromTask(String taskId, String userId);

    /**
     * 为某个Task替换候选人
     * @param taskId 任务ID
     * @param oldUserId 已有候选人
     * @param newUserId 新候选人
     */
    public void replaceCandidateUserFromTask(String taskId, String oldUserId, String newUserId);
    /**
     * 为某个Task添加候选人
     * @param taskId 任务ID
     * @param userId 人员ID
     */
    public void addCandidateUserToTask(String taskId, String userId);

    /**
     * 为某个Task添加候选人/待办人
     * @param userOfTaskDto
     */
    public void addUserToTask(UserOfTaskDto userOfTaskDto);

    /**
     * 为某个Task删除候选人/待办人
     * @param userOfTaskDto
     */
    public void removeUserToTask(UserOfTaskDto userOfTaskDto);

    /**
     * 为某个任务指派委派人
     * @param taskId 任务ID
     * @param delegateUserId 代理人ID
     */
    public void delegateTask(String taskId,String delegateUserId);

    /**
     * 委派人完成任务
     * @param taskId
     */
    public void resolveTask(String taskId);


    // ==================== 流程变量相关 ======================

    /**
     * 为流程实例添加流程变量
     * @param map
     * @param executionId
     */
    public void addVariableToProcessInstance(String executionId,Map map);

    /**
     * 为任务实例添加流程变量
     * @param map
     * @param taskId
     */
    public void addVariableToTask(String taskId,Map map);

    /**
     * 根据任务ID查询流程变量
     * @param taskId 任务ID
     * @return
     */
    public Map<String,Object> queryVariableByTaskId(String taskId);
    /**
     * 根据执行ID查询流程变量
     * @param executionId 执行ID
     * @return
     */
    public Map<String,Object> queryVariableByExecutionId(String executionId);
    /**
     * 根据流程实例ID查询流程变量
     * @param processInstanceId 流程实例ID
     * @return
     */
    public Map<String,Object> queryVariableByProcessInstanceId(String processInstanceId);



    // ==================== 流程历史相关 ======================

    /**
     * 查询历史任务-分页
     * @param condition 查询条件
     * @return PageInfo<ProcessInstanceTaskHisEntity>
     */
    public PageInfo<ProcessInstanceTaskHisEntity> queryTaskHisPage(ProcessInstanceTaskHisEntity condition);

    /**
     * 查询历史任务
     * @param condition 查询条件
     * @return List<ProcessInstanceTaskEntity>
     */
    public List<ProcessInstanceTaskEntity> queryTaskHisList(ProcessInstanceTaskEntity condition);

    /**
     * 根据流程实例ID查询历史任务
     * @param processInstanceId 流程实例ID
     * @return List<ProcessInstanceTaskHisEntity>
     */
    public List<ProcessInstanceTaskEntity> queryTaskHisList(String processInstanceId);


    /**
     * 查询流程实例历史
     * @param condition 查询条件
     * @return PageInfo<ProcessInstanceEntity>
     */
    public PageInfo<ProcessInstanceEntity> queryProcessInstancePage(ProcessInstanceEntity condition);

    // ==================== 管理相关 ======================

    /**
     * 自由跳转
     * @param processInstanceId
     * @param activitiId 激活节点ID
     * @param variable 流程变量
     */
    public void freedomJump(String processInstanceId,String activitiId,Map<String,Object> variable);








    public ProcDefEntity queryProcDefByDefId(String procDefId);
    public ProcDeployEntity queryProcDeployByDeployId(String procDeployId);
    public ProcInfo queryProcInfo(ProcConstant type, String id);

    public List<ProcDefEntity> queryAllProcDefKeyList();
}
